export class Animal {
    public name: string;
    constructor(name: string) {
        this.name = name;
    }
    sayHi():string {
        return `My name is ${this.name}`;
    }
}

// 继承
export class Cat extends Animal {
  constructor(name: string) {
    super(name); // 调用父类的 constructor(name)
    console.log(this.name);
  }
  sayHi() {
    return 'Meow, ' + super.sayHi(); // 调用父类的 sayHi()
  }
}


// 存取器§
// 使用 getter 和 setter 可以改变属性的赋值和读取行为：
export class Animal22 {
	public name: string;
	constructor(name: string) {
		this.name = name;
	};
	get name1() {
		return "迪迦"
	}
	set name1(value: string) {
		console.log(`被设置了为${value}`)
	}
	sayHi() {
		return `my name is ${this.name1}`;
	}
}


// 静态方法
export class AnimalStatic {
	static isAnimal(value: any) {
		return value instanceof AnimalStatic;
	}
}
// public 修饰的属性或方法是公有的，可以在任何地方被访问到，默认所有的属性和方法都是 public 的
export class publicAnimal {
	public name: string;
	public constructor(name: string) {
		this.name = name;
	}
}

// 私有
export class privateAnimal {
	private name: string;
	public constructor(name: string) {
		this.name = name;
	}
}
	// 不可访问 报错
	// let privateAnimal11 = new privateAnimal("publicAnimal");
	// 	console.log(privateAnimal11.name);
	
	
	
// public 修饰的属性或方法是公有的，可以在任何地方被访问到，默认所有的属性和方法都是 public 的

// private 修饰的属性或方法是私有的，不能在声明它的类的外部访问
// 当构造函数修饰为 private 时，该类不允许被继承或者实例化：

// protected 修饰的属性或方法是受保护的，它和 private 类似，区别是它在子类中也是允许被访问的
// 当构造函数修饰为 protected 时，该类只允许被继承：


// readonly§
// 只读属性关键字，只允许出现在属性声明或索引签名或构造函数中。
export class readonlyAnimal {
	readonly name: string;
	public constructor(name: string) {
		this.name = name;
	}
}